import yaml


class TranslationConfig:
    """
    TranslationConfig类用于管理翻译配置。
    该类使用单例模式确保全局仅有一个实例，以提供全局唯一的配置访问点。
    """

    _instance = None  # 类变量，用于存储单例实例

    def __new__(cls):
        """
        创建或返回TranslationConfig类的单例实例。

        参数:
        - cls: 当前类，即TranslationConfig。

        返回值:
        - 返回TranslationConfig类的单例实例。
        """
        if cls._instance is None:
            # 如果当前类的实例不存在，则创建一个新的实例
            cls._instance = super(TranslationConfig, cls).__new__(cls)
            # 初始化实例私有变量__config为None
            cls._instance._config = None
        return cls._instance

    def initialize(self, args):
        """
        初始化配置，从指定的配置文件加载配置，并允许通过命令行参数覆盖部分配置。

        参数:
        - args: 包含配置文件路径等初始化参数的对象。
        """
        # 从配置文件加载配置
        with open(args.config_file, 'r') as f:
            config = yaml.safe_load(f)
        # 使用命令行参数覆盖配置文件中的值
        overridden_values = {
            key: value for key, value in vars(args).items() if key in config and value is not None
        }
        config.update(overridden_values)
        self._instance._config = config

    def __getattr__(self, name):
        """
        当尝试访问TranslationConfig实例的属性时，此方法会被调用。
        如果所访问的属性存在于配置中，则返回该属性的值；否则抛出AttributeError。

        参数:
        - name: 要访问的属性名。

        返回值:
        - 配置中对应属性的值。

        异常:
        - AttributeError: 如果属性不存在于配置中，则抛出。
        """
        if self._instance._config and name in self._instance._config:
            return self._instance._config[name]
        raise AttributeError(f"TranslationConfig object has no attribute {name}")
